home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGMISC / PCSSP.LZH / PC-SSP.ZIP / MATINSL.ZIP / MFGR.FOR < prev    next >
Text File  |  1985-11-29  |  5KB  |  199 lines

  1. C
  2. C     ..................................................................
  3. C
  4. C        SUBROUTINE MFGR
  5. C
  6. C        PURPOSE
  7. C           FOR A GIVEN M BY N MATRIX THE FOLLOWING CALCULATIONS
  8. C           ARE PERFORMED
  9. C           (1) DETERMINE RANK AND LINEARLY INDEPENDENT ROWS AND
  10. C               COLUMNS (BASIS).
  11. C           (2) FACTORIZE A SUBMATRIX OF MAXIMAL RANK.
  12. C           (3) EXPRESS NON-BASIC ROWS IN TERMS OF BASIC ONES.
  13. C           (4) EXPRESS BASIC VARIABLES IN TERMS OF FREE ONES.
  14. C
  15. C        USAGE
  16. C           CALL MFGR(A,M,N,EPS,IRANK,IROW,ICOL)
  17. C
  18. C        DESCRIPTION OF PARAMETERS
  19. C           A      - GIVEN MATRIX WITH M ROWS AND N COLUMNS.
  20. C                    ON RETURN A CONTAINS THE FIVE SUBMATRICES
  21. C                    L, R, H, D, O.
  22. C           M      - NUMBER OF ROWS OF MATRIX A.
  23. C           N      - NUMBER OF COLUMNS OF MATRIX A.
  24. C           EPS    - TESTVALUE FOR ZERO AFFECTED BY ROUNDOFF NOISE.
  25. C           IRANK  - RESULTANT RANK OF GIVEN MATRIX.
  26. C           IROW   - INTEGER VECTOR OF DIMENSION M CONTAINING THE
  27. C                    SUBSCRIPTS OF BASIC ROWS IN IROW(1),...,IROW(IRANK)
  28. C           ICOL   - INTEGER VECTOR OF DIMENSION N CONTAINING THE
  29. C                    SUBSCRIPTS OF BASIC COLUMNS IN ICOL(1) UP TO
  30. C                    ICOL(IRANK).
  31. C
  32. C        REMARKS
  33. C           THE LEFT HAND TRIANGULAR FACTOR IS NORMALIZED SUCH THAT
  34. C           THE DIAGONAL CONTAINS ALL ONES THUS ALLOWING TO STORE ONLY
  35. C           THE SUBDIAGONAL PART.
  36. C
  37. C        SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
  38. C           NONE
  39. C
  40. C        METHOD
  41. C           GAUSSIAN ELIMINATION TECHNIQUE IS USED FOR CALCULATION
  42. C           OF THE TRIANGULAR FACTORS OF A GIVEN MATRIX.
  43. C           COMPLETE PIVOTING IS BUILT IN.
  44. C           IN CASE OF A SINGULAR MATRIX ONLY THE TRIANGULAR FACTORS
  45. C           OF A SUBMATRIX OF MAXIMAL RANK ARE RETAINED.
  46. C           THE REMAINING PARTS OF THE RESULTANT MATRIX GIVE THE
  47. C           DEPENDENCIES OF ROWS AND THE SOLUTION OF THE HOMOGENEOUS
  48. C           MATRIX EQUATION A*X=0.
  49. C
  50. C     ..................................................................
  51. C
  52.       SUBROUTINE MFGR(A,M,N,EPS,IRANK,IROW,ICOL)
  53. C
  54. C        DIMENSIONED DUMMY VARIABLES
  55.       DIMENSION A(1),IROW(1),ICOL(1)
  56. C
  57. C       TEST OF SPECIFIED DIMENSIONS
  58.       IF(M)2,2,1
  59.     1 IF(N)2,2,4
  60.     2 IRANK=-1
  61.     3 RETURN
  62. C       RETURN IN CASE OF FORMAL ERRORS
  63. C
  64. C
  65. C        INITIALIZE COLUMN INDEX VECTOR
  66. C        SEARCH FIRST PIVOT ELEMENT
  67.     4 IRANK=0
  68.       PIV=0.
  69.       JJ=0
  70.       DO 6 J=1,N
  71.       ICOL(J)=J
  72.       DO 6 I=1,M
  73.       JJ=JJ+1
  74.       HOLD=A(JJ)
  75.       IF(ABS(PIV)-ABS(HOLD))5,6,6
  76.     5 PIV=HOLD
  77.       IR=I
  78.       IC=J
  79.     6 CONTINUE
  80. C
  81. C        INITIALIZE ROW INDEX VECTOR
  82.       DO 7 I=1,M
  83.     7 IROW(I)=I
  84. C
  85. C        SET UP INTERNAL TOLERANCE
  86.       TOL=ABS(EPS*PIV)
  87. C
  88. C        INITIALIZE ELIMINATION LOOP
  89.       NM=N*M
  90.       DO 19 NCOL=M,NM,M
  91. C
  92. C        TEST FOR FEASIBILITY OF PIVOT ELEMENT
  93.     8 IF(ABS(PIV)-TOL)20,20,9
  94. C
  95. C        UPDATE RANK
  96.     9 IRANK=IRANK+1
  97. C
  98. C        INTERCHANGE ROWS IF NECESSARY
  99.       JJ=IR-IRANK
  100.       IF(JJ)12,12,10
  101.    10 DO 11 J=IRANK,NM,M
  102.       I=J+JJ
  103.       SAVE=A(J)
  104.       A(J)=A(I)
  105.    11 A(I)=SAVE
  106. C
  107. C        UPDATE ROW INDEX VECTOR
  108.       JJ=IROW(IR)
  109.       IROW(IR)=IROW(IRANK)
  110.       IROW(IRANK)=JJ
  111. C
  112. C        INTERCHANGE COLUMNS IF NECESSARY
  113.    12 JJ=(IC-IRANK)*M
  114.       IF(JJ)15,15,13
  115.    13 KK=NCOL
  116.       DO 14 J=1,M
  117.       I=KK+JJ
  118.       SAVE=A(KK)
  119.       A(KK)=A(I)
  120.       KK=KK-1
  121.    14 A(I)=SAVE
  122. C
  123. C        UPDATE COLUMN INDEX VECTOR
  124.       JJ=ICOL(IC)
  125.       ICOL(IC)=ICOL(IRANK)
  126.       ICOL(IRANK)=JJ
  127.    15 KK=IRANK+1
  128.       MM=IRANK-M
  129.       LL=NCOL+MM
  130. C
  131. C        TEST FOR LAST ROW
  132.       IF(MM)16,25,25
  133. C
  134. C        TRANSFORM CURRENT SUBMATRIX AND SEARCH NEXT PIVOT
  135.    16 JJ=LL
  136.       SAVE=PIV
  137.       PIV=0.
  138.       DO 19 J=KK,M
  139.       JJ=JJ+1
  140.       HOLD=A(JJ)/SAVE
  141.       A(JJ)=HOLD
  142.       L=J-IRANK
  143. C
  144. C        TEST FOR LAST COLUMN
  145.       IF(IRANK-N)17,19,19
  146.    17 II=JJ
  147.       DO 19 I=KK,N
  148.       II=II+M
  149.       MM=II-L
  150.       A(II)=A(II)-HOLD*A(MM)
  151.       IF(ABS(A(II))-ABS(PIV))19,19,18
  152.    18 PIV=A(II)
  153.       IR=J
  154.       IC=I
  155.    19 CONTINUE
  156. C
  157. C        SET UP MATRIX EXPRESSING ROW DEPENDENCIES
  158.    20 IF(IRANK-1)3,25,21
  159.    21 IR=LL
  160.       DO 24 J=2,IRANK
  161.       II=J-1
  162.       IR=IR-M
  163.       JJ=LL
  164.       DO 23 I=KK,M
  165.       HOLD=0.
  166.       JJ=JJ+1
  167.       MM=JJ
  168.       IC=IR
  169.       DO 22 L=1,II
  170.       HOLD=HOLD+A(MM)*A(IC)
  171.       IC=IC-1
  172.    22 MM=MM-M
  173.    23 A(MM)=A(MM)-HOLD
  174.    24 CONTINUE
  175. C
  176. C        TEST FOR COLUMN REGULARITY
  177.    25 IF(N-IRANK)3,3,26
  178. C
  179. C        SET UP MATRIX EXPRESSING BASIC VARIABLES IN TERMS OF FREE
  180. C       PARAMETERS (HOMOGENEOUS SOLUTION).
  181.    26 IR=LL
  182.       KK=LL+M
  183.       DO 30 J=1,IRANK
  184.       DO 29 I=KK,NM,M
  185.       JJ=IR
  186.       LL=I
  187.       HOLD=0.
  188.       II=J
  189.    27 II=II-1
  190.       IF(II)29,29,28
  191.    28 HOLD=HOLD-A(JJ)*A(LL)
  192.       JJ=JJ-M
  193.       LL=LL-1
  194.       GOTO 27
  195.    29 A(LL)=(HOLD-A(LL))/A(JJ)
  196.    30 IR=IR-1
  197.       RETURN
  198.       END
  199.